Completed
Push — master ( 7f04f6...e0daae )
by Sander
01:06
created

$j.ready   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 5
rs 9.4285
1
/* global API */
2
var $j = jQuery.noConflict();
3
$j(document).ready(function () {
4
    var _this = this;
5
6
    function removePasswordPicker() {
7
        $j('.passwordPickerIframe').remove();
8
    }
9
    _this.removePasswordPicker = removePasswordPicker;
10
11
    function enterLoginDetails(login) {
12
        var username = (login.username.trim() !== '' ) ? login.username : login.email;
13
14
        fillPassword(username, login.password);
15
        if ($j('.passwordPickerIframe').is(':visible')) {
16
            removePasswordPicker();
17
        }
18
    }
19
20
    _this.enterLoginDetails = enterLoginDetails;
21
22
23
    function showPasswordPicker(form) {
24
        if($j('.passwordPickerIframe').length > 1){
25
            return;
26
        }
27
        var loginField = $j(form[0]);
28
        var loginFieldPos = loginField.offset();
29
        var position = $j(form[1]).position();
0 ignored issues
show
Unused Code introduced by
The assignment to variable position seems to be never used. Consider removing it.
Loading history...
30
        var passwordField = $j(form[1]);
31
        var passwordFieldPos = passwordField.offset();
32
33
        var left = loginFieldPos.left;
34
        var top = loginFieldPos.top;
35
        
36
        if (passwordFieldPos.top > loginFieldPos.top) {
37
            //console.log('login fields below each other')
38
            top = passwordFieldPos.top + passwordField.height() + 10;
39
40
        } else {
41
            // console.log('login fields next to each other')
42
            top = top + loginField.height() + 10;
43
        }
44
45
46
        var pickerUrl = API.extension.getURL('/html/inject/password_picker.html');
47
48
        var picker = $j('<iframe class="passwordPickerIframe" scrolling="no" height="400" width="350" frameborder="0" src="'+ pickerUrl+'"></iframe>');
49
        picker.css('position', 'absolute');
50
        picker.css('left', left);
51
        picker.css('z-index', 999);
52
        picker.css('top', top);
53
        $j('body').append($j(picker));
54
        // picker.css('width', $j(form).width());
55
        $j('.passwordPickerIframe:not(:last)').remove();
56
    }
57
58
    function createFormIcon(el, form) {
59
        var offset = el.offset();
0 ignored issues
show
Unused Code introduced by
The assignment to variable offset seems to be never used. Consider removing it.
Loading history...
60
        var width = el.width();
61
        var height = el.height()*1;
62
        var margin = (el.css('margin')) ? parseInt(el.css('margin').replace('px', '')) : 0;
0 ignored issues
show
Unused Code introduced by
The variable margin seems to be never used. Consider removing it.
Loading history...
63
        var padding = (el.css('padding')) ? parseInt(el.css('padding').replace('px', '')) : 0;
0 ignored issues
show
Unused Code introduced by
The variable padding seems to be never used. Consider removing it.
Loading history...
64
65
        var pickerIcon = 'data:image/png;base64,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';
66
        
67
        $j(el).css('background-image', 'url("'+ pickerIcon +'")');
68
        $j(el).css('background-size', 'contain');
69
        $j(el).css('background-repeat', 'no-repeat');
70
        $j(el).css('background-position-x', 'right');
71
72
73
        function onClick (e) {
74
            e.preventDefault();
75
            var offsetX = e.offsetX;
76
            var offsetRight = (width - offsetX);
77
            if(offsetRight < height){
78
                showPasswordPicker(form);
79
            }
80
        }
81
82
       // $j(el).bind('click', onClick);
83
        $j(el).click(onClick);
84
85
    }
86
87
    function createPasswordPicker(form) {
88
        for (var i = 0; i < form.length; i++) {
89
            var el = $j(form[i]);
90
            createFormIcon(el, form);
91
92
        }
93
    }
94
95
    function formSubmitted(fields) {
96
        var user = fields[0].value;
97
        var pass = fields[1].value;
98
        var params = {
99
            username: user,
100
            password: pass
101
        };
102
        //Disable password mining
103
        //$j(fields[1]).attr('type', 'hidden');
104
        API.runtime.sendMessage(API.runtime.id, {method: "minedForm", args: params});
105
106
    }
107
108
    function inIframe() {
109
        try {
110
            return window.self !== window.top;
111
        } catch (e) {
112
            return true;
113
        }
114
    }
115
116
    function showDoorhanger(data) {
117
        var buttons = data.buttons;
118
        data = data.data;
119
        if(inIframe()){
120
            return;
121
        }
122
        var doorhanger_div = $j('<div id="password-toolbar" style="display: none;">');
123
        $j('<span>',{
124
            class:'toolbar-text',
125
            text: data.title + ' ' + data.username + ' at ' + data.url
126
        }).appendTo(doorhanger_div);
127
128
129
130
        $j.each(buttons, function (k, button) {
131
            var html_button = $j('<button class="passman-btn passnman-btn-success"></button>').text(button.text);
132
            html_button.click(button.onClickFn);
133
            doorhanger_div.append(html_button);
134
        });
135
136
137
        $j('#password-toolbar').remove();
138
        $j('body').append(doorhanger_div);
139
        $j('#password-toolbar').slideDown();
140
    }
141
    _this.showDoorhanger = showDoorhanger;
142
143
    function showUrlUpdateDoorhanger(data){
144
        var buttons = [
145
            {
146
                text: 'Cancel',
147
                onClickFn: function () {
148
                    $j('#password-toolbar').slideUp();
149
                }
150
            },
151
            {
152
                text: 'Update',
153
                onClickFn: function () {
154
                    //closeToolbar();
155
                    API.runtime.sendMessage(API.runtime.id, {method: "updateCredentialUrl", args: data.data});
156
                    $j('#password-toolbar').find('.toolbar-text').text('Saving...');
157
                    $j('#password-toolbar').find('.passman-btn').hide();
158
                }
159
            }
160
        ];
161
        showDoorhanger({
162
            data: data.data,
163
            buttons: buttons
164
        });
165
    }
166
    _this.showUrlUpdateDoorhanger = showUrlUpdateDoorhanger;
167
168
    function checkForMined() {
169
        if (inIframe()) {
170
            return;
171
        }
172
        if(getLoginFields()){
173
            API.runtime.sendMessage(API.runtime.id, {method: "clearMined"});
174
            return;
175
        }
176
177
        API.runtime.sendMessage(API.runtime.id, {method: "getMinedData"}).then(function (data) {
178
            if (!data) {
179
                return;
180
            }
181
            if (data.hasOwnProperty('username') && data.hasOwnProperty('password') && data.hasOwnProperty('url')) {
182
                var btnText = (data.guid === null) ? 'Save' : 'Update';
183
184
                var buttons = [
185
                    {
186
                        text: 'Cancel',
187
                        onClickFn: function () {
188
                            closeToolbar();
189
                            API.runtime.sendMessage(API.runtime.id, {method: "clearMined"});
190
                        }
191
                    },
192
                    {
193
                        text: btnText,
194
                        onClickFn: function () {
195
                            //closeToolbar();
196
                            API.runtime.sendMessage(API.runtime.id, {method: "saveMined"});
197
                            $j('#password-toolbar').find('.toolbar-text').text('Saving...');
198
                            $j('#password-toolbar').find('.passman-btn').hide();
199
                        }
200
                    }
201
202
                ];
203
                showDoorhanger({data: data,buttons: buttons});
204
            }
205
        });
206
    }
207
208
    function minedLoginSaved(args) {
209
        // If the login added by the user then this is true
210
        if (args.selfAdded) {
211
            enterLoginDetails(args.credential);
212
            return;
213
        }
214
        if ($j('#password-toolbar').is(':visible')) {
215
            var action = (args.updated) ? 'updated' : 'saved';
216
            $j('#password-toolbar').html('Credential ' + action + '!');
217
            setTimeout(function () {
218
                closeToolbar();
219
            }, 2500);
220
        }
221
    }
222
223
    _this.minedLoginSaved = minedLoginSaved;
224
225
    function closeToolbar() {
226
        $j('#password-toolbar').slideUp(400, function () {
227
            $j('#password-toolbar').remove();
228
        });
229
    }
230
231
232
    function init() {
233
234
        checkForMined();
235
        API.runtime.sendMessage(API.runtime.id, {method: 'getRuntimeSettings'}).then(function (result) {
236
            var disablePasswordPicker = result.disablePasswordPicker;
237
238
            var loginFields = getLoginFields();
239
            if (loginFields.length > 0) {
240
                for (var i = 0; i < loginFields.length; i++) {
241
                    var form = getFormFromElement(loginFields[i][0]);
242
                    if(!disablePasswordPicker) {
243
                        createPasswordPicker(loginFields[i], form);
0 ignored issues
show
Bug introduced by
The call to createPasswordPicker seems to have too many arguments starting with form.
Loading history...
244
                    }
245
                    //Password miner
246
                    /* jshint ignore:start */
247
                    $j(form).submit((function (loginFields) {
248
                        return function () {
249
                            formSubmitted(loginFields);
250
                        };
251
                    })(loginFields[i]));
252
                    /* jshint ignore:end */
253
                }
254
255
                var url = window.location.href; //@TODO use a extension function
256
                API.runtime.sendMessage(API.runtime.id, {
257
                    method: "getCredentialsByUrl",
258
                    args: [url]
259
                }).then(function (logins) {
260
                    //console.log('Found ' + logins.length + ' logins for this site');
261
                    if (logins.length === 1) {
262
                        API.runtime.sendMessage(API.runtime.id, {method: 'isAutoFillEnabled'}).then(function (isEnabled) {
263
                            if (isEnabled) {
264
                                enterLoginDetails(logins[0]);
265
                            }
266
                        });
267
                    }
268
269
                });
270
            }
271
272
        });
273
274
    }
275
276
    var readyStateCheckInterval = setInterval(function () {
277
        if (document.readyState === "complete") {
278
            clearInterval(readyStateCheckInterval);
279
            API.runtime.sendMessage(API.runtime.id, {method: 'getMasterPasswordSet'}).then(function (result) {
280
                if (result) {
281
                    init();
282
                } else {
283
                    console.log('[Passman extension] Stopping, vault key not set');
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
284
                }
285
            });
286
287
            // var body = document.getElementsByTagName('body')[0];
288
            // observeDOM(body, function () {
289
            //     //init()
290
            // });
291
        }
292
    }, 10);
293
294
    API.runtime.onMessage.addListener(function (msg, sender, sendResponse) {
0 ignored issues
show
Unused Code introduced by
The parameter sendResponse is not used and could be removed.

This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.

Loading history...
295
        //console.log('Method call', msg.method);
296
        if(_this[msg.method]) {
297
            _this[msg.method](msg.args, sender);
298
        }
299
    });
300
});